iT邦幫忙

0

[Day16]資料夾清單 ➜ CSV

  • 分享至 

  • xImage
  •  

今天做一個零相依、超短小工具:把指定資料夾的檔案清單匯出成 CSV。
支援:遞迴子資料夾、副檔名過濾、加上檔案雜湊(可選)。

程式碼(存成 ls_csv.py)

# ls_csv.py — 列出檔案清單到 CSV(可遞迴/過濾/可選雜湊)
from __future__ import annotations
import argparse, csv, hashlib, time
from pathlib import Path
from typing import Iterable, List

def iter_files(root: Path, recursive: bool, patterns: List[str] | None) -> Iterable[Path]:
    pats = patterns or ["*"]
    seen = set()
    for pat in pats:
        glob = root.rglob if recursive else root.glob
        for p in glob(pat):
            if p.is_file():
                rp = p.resolve()
                if rp not in seen:
                    seen.add(rp)
                    yield p

def file_hash(p: Path, algo="sha1", chunk=1024*1024) -> str:
    h = hashlib.new(algo)
    with p.open("rb") as f:
        for b in iter(lambda: f.read(chunk), b""):
            h.update(b)
    return h.hexdigest()

def main():
    ap = argparse.ArgumentParser(description="資料夾清單 ➜ CSV")
    ap.add_argument("--src", type=Path, required=True, help="來源資料夾")
    ap.add_argument("--recursive", action="store_true", help="包含子資料夾")
    ap.add_argument("--match", nargs="*", help="過濾 pattern,如 '*.pdf' '*.jpg'")
    ap.add_argument("--with-hash", action="store_true", help="額外輸出 SHA1 雜湊")
    ap.add_argument("--out", type=Path, default=Path("exports/list.csv"), help="輸出 CSV 路徑")
    args = ap.parse_args()

    files = list(iter_files(args.src, args.recursive, args.match))
    if not files:
        print("找不到檔案(檢查 --match 或路徑)"); return

    args.out.parent.mkdir(parents=True, exist_ok=True)
    cols = ["path", "name", "ext", "size", "mtime"]
    if args.with_hash: cols.append("sha1")

    with args.out.open("w", encoding="utf-8", newline="") as f:
        w = csv.DictWriter(f, fieldnames=cols); w.writeheader()
        for i, p in enumerate(files, 1):
            st = p.stat()
            row = {
                "path": str(p),
                "name": p.stem,
                "ext": p.suffix.lower(),
                "size": st.st_size,
                "mtime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(st.st_mtime)),
            }
            if args.with_hash: row["sha1"] = file_hash(p)
            w.writerow(row)
            if i % 200 == 0: print(f"...{i}/{len(files)}")

    print(f"✅ 已輸出:{args.out}({len(files)} 筆)")

if __name__ == "__main__":
    main()

怎麼用(PowerShell)

# 1) 列出目前資料夾所有檔案(不含子資料夾)
python .\ls_csv.py --src .

# 2) 遞迴列出所有 PDF、JPG,輸出到 exports\list_media.csv
python .\ls_csv.py --src . --recursive --match '*.pdf' '*.jpg' --out .\exports\list_media.csv

# 3) 需要雜湊欄位(較慢)
python .\ls_csv.py --src . --recursive --with-hash

實作:
https://ithelp.ithome.com.tw/upload/images/20250930/20169368AAMlPYyo4W.png
小提醒
PowerShell 的萬用字元記得加引號:'.pdf'、'.jpg'
mtime 是最後修改時間;要改成建立時間可自行讀 st_ctime
加 --with-hash 會逐檔讀取計算雜湊,檔案多時會比較慢


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言